/*
 * Title: 数据库（DataBase）
 * Author: Yuanshun L
 * Created : 11-otc-2021
 * Question Description: 是否存在(r1,c1)和(r2,c1)相同，并且(r1,c2)和(r2,c2)相同
 */

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>

using namespace std;

#define MAXN 10001
#define MAXM 101

int n,m;// n行m列的数据库表

// 二元组
struct Tuple{
    int x1,x2;
    Tuple(int x1,int x2) : x1(x1),x2(x2){}
};

// map的键的比较
bool operator==(const Tuple & t1, const Tuple& t2){
    if(t1.x1==t2.x1 && t1.x2 == t2.x2)
        return true;
    return false;
}

// map会自动排序，因此需要给自定义类型定义一个小于符号
bool operator<(const Tuple & t1, const Tuple& t2){
    if(t1.x1 * t1.x1 + t1.x2*t1.x2 < t2.x1 * t2.x1 + t2.x2*t2.x2)
        return true;
    return false;
}

map<string,int> sim; // 字符串到编号的映射
vector<int> db[MAXN];
map<Tuple,int> tim; // 二元组到行号的映射
int id;

// 扫描上下每行
int scan_row(int c1,int c2,int &r1,int &r2){
    tim.clear();
    for(int i=0;i<n;i++){
        // 找到了前面的一行
        Tuple t = Tuple(db[i][c1],db[i][c2]);
        if(tim.count(t)){
            r1 = tim[t];
            r2 = i;
            return 1;
        }
        else{
            tim[t] = i;
        }
    }
    return 0;
}

int ID(string &s){
    if(sim.count(s))
        return sim[s];
    else{
        sim[s] = id;
        return id++;
    }
}

char read_text_character(){
    char ch;
    while(1){
        cin>>ch;
        if(ch!='\n')
            return ch;
    }
}

int main(){
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);

    // 填充数据库
    int count; // 下一个待填的id
    string s,s2;
    char ch;
    while(cin>>n>>m){
        id=0;
        for(int i=0;i<n;i++){
            count=0;
            for(;;){
                if(count == 2){
                    cin >> s2;
                    db[i].push_back(ID(s2));
                    getchar();
                    s2.clear();
                    break;
                }
                else{
                    ch = read_text_character();
                    if(ch==','){
                        db[i].push_back(ID(s2));
                        s2.clear();
                        count++;
                    }
                    else{
                        s2.push_back(ch);
                    }
                }
            }
        } // for

        int c1=0,c2=0,r1=-1,r2=-1;
        for(c1=0;c1<m-1;c1++){
            for(c2=c1+1;c2<m;c2++){
                if(scan_row(c1,c2,r1,r2)) break;
            }
            if(c2<m) break;
        }// for

        if(r1!=-1){
            cout<<"NO\n";
            cout<<r1+1<<" "<<r2+1<<endl;
            cout<<c1+1<<" "<<c2+1<<endl;
        }
        else{
            cout<<"YES\n";
        }
    }// while
    return 0;
}